{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "bb4186e3-94cf-4bce-b36b-71e89b732710",
   "metadata": {
    "id": "bb4186e3-94cf-4bce-b36b-71e89b732710"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\alexe\\anaconda3\\lib\\site-packages\\scipy\\__init__.py:155: UserWarning: A NumPy version >=1.18.5 and <1.25.0 is required for this version of SciPy (detected version 1.26.2\n",
      "  warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "from sklearn.feature_extraction import DictVectorizer\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.metrics import mean_squared_error\n",
    "\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97yfKrCqBVSc",
   "metadata": {
    "id": "97yfKrCqBVSc"
   },
   "source": [
    "### Q1. Downloading the data\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "cbe379c6-5a79-491b-af10-c85039a1d13c",
   "metadata": {
    "id": "cbe379c6-5a79-491b-af10-c85039a1d13c"
   },
   "outputs": [],
   "source": [
    "df = pd.read_parquet('https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "6635ef08-4a6d-43f4-9b36-26c728aec8be",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 270
    },
    "id": "6635ef08-4a6d-43f4-9b36-26c728aec8be",
    "outputId": "17104c4c-3224-4dfc-eb71-d1e33d671148"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>VendorID</th>\n",
       "      <th>tpep_pickup_datetime</th>\n",
       "      <th>tpep_dropoff_datetime</th>\n",
       "      <th>passenger_count</th>\n",
       "      <th>trip_distance</th>\n",
       "      <th>RatecodeID</th>\n",
       "      <th>store_and_fwd_flag</th>\n",
       "      <th>PULocationID</th>\n",
       "      <th>DOLocationID</th>\n",
       "      <th>payment_type</th>\n",
       "      <th>fare_amount</th>\n",
       "      <th>extra</th>\n",
       "      <th>mta_tax</th>\n",
       "      <th>tip_amount</th>\n",
       "      <th>tolls_amount</th>\n",
       "      <th>improvement_surcharge</th>\n",
       "      <th>total_amount</th>\n",
       "      <th>congestion_surcharge</th>\n",
       "      <th>airport_fee</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>2023-01-01 00:32:10</td>\n",
       "      <td>2023-01-01 00:40:36</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.97</td>\n",
       "      <td>1.0</td>\n",
       "      <td>N</td>\n",
       "      <td>161</td>\n",
       "      <td>141</td>\n",
       "      <td>2</td>\n",
       "      <td>9.3</td>\n",
       "      <td>1.00</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>14.30</td>\n",
       "      <td>2.5</td>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>2023-01-01 00:55:08</td>\n",
       "      <td>2023-01-01 01:01:27</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.10</td>\n",
       "      <td>1.0</td>\n",
       "      <td>N</td>\n",
       "      <td>43</td>\n",
       "      <td>237</td>\n",
       "      <td>1</td>\n",
       "      <td>7.9</td>\n",
       "      <td>1.00</td>\n",
       "      <td>0.5</td>\n",
       "      <td>4.00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>16.90</td>\n",
       "      <td>2.5</td>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>2023-01-01 00:25:04</td>\n",
       "      <td>2023-01-01 00:37:49</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.51</td>\n",
       "      <td>1.0</td>\n",
       "      <td>N</td>\n",
       "      <td>48</td>\n",
       "      <td>238</td>\n",
       "      <td>1</td>\n",
       "      <td>14.9</td>\n",
       "      <td>1.00</td>\n",
       "      <td>0.5</td>\n",
       "      <td>15.00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>34.90</td>\n",
       "      <td>2.5</td>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>2023-01-01 00:03:48</td>\n",
       "      <td>2023-01-01 00:13:25</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.90</td>\n",
       "      <td>1.0</td>\n",
       "      <td>N</td>\n",
       "      <td>138</td>\n",
       "      <td>7</td>\n",
       "      <td>1</td>\n",
       "      <td>12.1</td>\n",
       "      <td>7.25</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>20.85</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2</td>\n",
       "      <td>2023-01-01 00:10:29</td>\n",
       "      <td>2023-01-01 00:21:19</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.43</td>\n",
       "      <td>1.0</td>\n",
       "      <td>N</td>\n",
       "      <td>107</td>\n",
       "      <td>79</td>\n",
       "      <td>1</td>\n",
       "      <td>11.4</td>\n",
       "      <td>1.00</td>\n",
       "      <td>0.5</td>\n",
       "      <td>3.28</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>19.68</td>\n",
       "      <td>2.5</td>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   VendorID tpep_pickup_datetime tpep_dropoff_datetime  passenger_count  \\\n",
       "0         2  2023-01-01 00:32:10   2023-01-01 00:40:36              1.0   \n",
       "1         2  2023-01-01 00:55:08   2023-01-01 01:01:27              1.0   \n",
       "2         2  2023-01-01 00:25:04   2023-01-01 00:37:49              1.0   \n",
       "3         1  2023-01-01 00:03:48   2023-01-01 00:13:25              0.0   \n",
       "4         2  2023-01-01 00:10:29   2023-01-01 00:21:19              1.0   \n",
       "\n",
       "   trip_distance  RatecodeID store_and_fwd_flag  PULocationID  DOLocationID  \\\n",
       "0           0.97         1.0                  N           161           141   \n",
       "1           1.10         1.0                  N            43           237   \n",
       "2           2.51         1.0                  N            48           238   \n",
       "3           1.90         1.0                  N           138             7   \n",
       "4           1.43         1.0                  N           107            79   \n",
       "\n",
       "   payment_type  fare_amount  extra  mta_tax  tip_amount  tolls_amount  \\\n",
       "0             2          9.3   1.00      0.5        0.00           0.0   \n",
       "1             1          7.9   1.00      0.5        4.00           0.0   \n",
       "2             1         14.9   1.00      0.5       15.00           0.0   \n",
       "3             1         12.1   7.25      0.5        0.00           0.0   \n",
       "4             1         11.4   1.00      0.5        3.28           0.0   \n",
       "\n",
       "   improvement_surcharge  total_amount  congestion_surcharge  airport_fee  \n",
       "0                    1.0         14.30                   2.5         0.00  \n",
       "1                    1.0         16.90                   2.5         0.00  \n",
       "2                    1.0         34.90                   2.5         0.00  \n",
       "3                    1.0         20.85                   0.0         1.25  \n",
       "4                    1.0         19.68                   2.5         0.00  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "f055344d-f050-4fcf-8453-ee4a66407bfe",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "f055344d-f050-4fcf-8453-ee4a66407bfe",
    "outputId": "68b659fe-15ba-468b-9f87-41122d66ba85"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "19"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df.columns)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "pWrLGUESBed6",
   "metadata": {
    "id": "pWrLGUESBed6"
   },
   "source": [
    "### Q2. Computing duration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "b186962d-7ee1-4b97-a457-7ef2b2de811a",
   "metadata": {
    "id": "b186962d-7ee1-4b97-a457-7ef2b2de811a"
   },
   "outputs": [],
   "source": [
    "df['duration'] = df.tpep_dropoff_datetime - df.tpep_pickup_datetime\n",
    "df['duration'] = df.duration.dt.total_seconds() / 60"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "0e3e89da-45a3-4b12-99bb-8b56457cfa5a",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "0e3e89da-45a3-4b12-99bb-8b56457cfa5a",
    "outputId": "289c84a9-b93f-4400-edd9-300dada8dec0"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "15.668995167332046"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.duration.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "9da88772-b29c-4c46-8859-7c28ac2be021",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "9da88772-b29c-4c46-8859-7c28ac2be021",
    "outputId": "d8bc9a61-e953-400a-98a5-9613b8bc7021",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "42.594351241920904"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.duration.std()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca0c395a-d5cf-4870-aa64-edb4809bc662",
   "metadata": {
    "id": "ca0c395a-d5cf-4870-aa64-edb4809bc662"
   },
   "source": [
    "### Q3. Dropping outliers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "a06d9882-82bc-40eb-954e-ebabde6e5431",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "a06d9882-82bc-40eb-954e-ebabde6e5431",
    "outputId": "b318ae8f-3d3c-4115-8111-9415bd7def9b"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "98.1220282212598"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df[(df.duration >= 1) & (df.duration <= 60)]) / len(df) * 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "0fd4307e-f3b6-45ba-bf1d-82e4a1c09a9b",
   "metadata": {
    "id": "0fd4307e-f3b6-45ba-bf1d-82e4a1c09a9b"
   },
   "outputs": [],
   "source": [
    "df = df[(df.duration >= 1) & (df.duration <= 60)].copy()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "00b428a6-3438-4482-91fb-04ed17f5fe8d",
   "metadata": {
    "id": "00b428a6-3438-4482-91fb-04ed17f5fe8d"
   },
   "source": [
    "### Q4. One-hot encoding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "96043224-1a51-4922-901c-c660b0bc8a5b",
   "metadata": {
    "id": "96043224-1a51-4922-901c-c660b0bc8a5b"
   },
   "outputs": [],
   "source": [
    "categorical = ['PULocationID', 'DOLocationID']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "8853a0e2-7d3f-46e6-a45d-eeadc7c65bd1",
   "metadata": {
    "id": "8853a0e2-7d3f-46e6-a45d-eeadc7c65bd1"
   },
   "outputs": [],
   "source": [
    "df[categorical] = df[categorical].astype(str)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "3bb3cef4-bb13-4b20-a1ba-0c23b27062de",
   "metadata": {
    "id": "3bb3cef4-bb13-4b20-a1ba-0c23b27062de"
   },
   "outputs": [],
   "source": [
    "train_dicts = df[categorical].to_dict(orient='records')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "f89a6a92-bc5b-4aac-9366-aa9ea7029df6",
   "metadata": {
    "id": "f89a6a92-bc5b-4aac-9366-aa9ea7029df6"
   },
   "outputs": [],
   "source": [
    "dv = DictVectorizer()\n",
    "X_train = dv.fit_transform(train_dicts)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "bfb1d21f-23e8-411d-b70d-748b9b672efb",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "bfb1d21f-23e8-411d-b70d-748b9b672efb",
    "outputId": "46aafa55-2e06-4f5b-b0cf-a14353d3dd95"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Feature matrix size: (3009173, 515)\n"
     ]
    }
   ],
   "source": [
    "print(f'Feature matrix size: {X_train.shape}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bb9c2670-07b9-4813-9798-d367fc6535fe",
   "metadata": {
    "id": "bb9c2670-07b9-4813-9798-d367fc6535fe"
   },
   "source": [
    "### Q5. Training a model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "098c5ff8-8e41-41a6-a7cd-760f9c79c1f9",
   "metadata": {
    "id": "098c5ff8-8e41-41a6-a7cd-760f9c79c1f9"
   },
   "outputs": [],
   "source": [
    "target = 'duration'\n",
    "y_train = df[target].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "986fd495-62f8-455c-a652-946f144c5832",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "986fd495-62f8-455c-a652-946f144c5832",
    "outputId": "f71a2119-1f4f-4d05-d60c-ad6dbd72b6c4"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train RMSE: 7.64926195987998\n"
     ]
    }
   ],
   "source": [
    "lr = LinearRegression()\n",
    "lr.fit(X_train, y_train)\n",
    "\n",
    "y_pred = lr.predict(X_train)\n",
    "\n",
    "print(f'Train RMSE: {mean_squared_error(y_train, y_pred, squared=False)}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "87051e49-1293-4e56-bda8-38e4f206e0ed",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 430
    },
    "id": "87051e49-1293-4e56-bda8-38e4f206e0ed",
    "outputId": "fb12601f-650e-421b-e120-a8a3236f37aa"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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C6isrMTBgwdRXV2NuXPnBruPRBQA2WlHSUUdoCih7goRUVRq00xTfn4+tm7digEDBqjHBg4ciBdeeIEbwYlCSKM3qjNOGn0crFYr9Hq9Vxv33qyEhIQWb4dERETe2jTTpCiKzw9iANDr9VD4Wy5FoUiqzyTqHTheXguHtRoPvLwTNpv3PiebzYZJz+X7HCciopa1KTTdcsstmDdvHn744Qf12NmzZ/GHP/wBo0ePDlrniMKFexN4qPczBUqjd21W1xrjIMuyzz6ocKpoTkQUKdoUmtasWYOamhpcfvnluPLKK9G3b19kZWWhpqYGq1evDnYficJCRAYNATz42l7OABMRBUGb9jT17t0b//73v1FYWIj//Oc/EEJg4MCBuPXWW4PdPyJqJ0nDfUtERMHQqpmmbdu2YeDAgaiurgYA3HbbbZgzZw7mzp2L6667DldffTW++OKLDukoERERUSi1KjStWrUK06ZNQ3Jyss85k8mEGTNmYMWKFUHrHBG1TWPNJiIiCpZWhaZvvvkGY8eObfZ8Tk4OioqK2t0ponDhvmou0u7pJuodKKmwQShyqLtCRBQ1WhWazp0757fUgJtOp0N5eXm7O0UULiL58nyNPg6KoqDeXhtxoY+IKBy1KjT96Ec/woEDB5o9/+2336Jnz57t7hRROAmHq+bamnlkpx3HzlVHZOgjIgo3rQpNv/jFL/CXv/wFdXV1Pudqa2vx17/+FePHjw9a54jChdVqjZgaTZ5kRx0krSHU3SAiigqtKjnw+OOP491338WPf/xjzJ49G/3794ckSThy5AheeOEFyLKMxx57rKP6SkRERBQyrQpN6enp2LVrFx5++GE8+uij6j4JSZIwZswYrF27Funp6R3SUSJqGyEEbDYb9zUREbVTq4tbXnbZZfjoo49QWVmJ//73vxBCoF+/fkhJSemI/hFRO4l6B+Zs/jcSkvhvlIioPdpUERwAUlJScN111wWzL0TUQbQN96IjIqK2a9O954gokggcN9ew9AARUTsxNBFdgntPECK4vraod+LoD+dRU1MT6q4QEUWskIamZcuW4brrrkNSUhLS0tIwceJEHD161KuNEAKLFy9GZmYm4uPjcdNNN+HQoUNebex2O+bMmYPu3bsjMTERd9xxB77//nuvNpWVlcjNzYXJZILJZEJubi4uXrzo1eb06dOYMGECEhMT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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.histplot(y_pred, label='prediction')\n",
    "sns.histplot(y_train, label='actual')\n",
    "\n",
    "plt.legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5259854b-65a5-4fd0-a8b9-87a41ce4835d",
   "metadata": {
    "id": "5259854b-65a5-4fd0-a8b9-87a41ce4835d"
   },
   "source": [
    "### Q6. Evaluating the model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "86965e06-89c1-47eb-bc1a-734721e389cd",
   "metadata": {
    "id": "86965e06-89c1-47eb-bc1a-734721e389cd"
   },
   "outputs": [],
   "source": [
    "categorical = ['PULocationID', 'DOLocationID']\n",
    "\n",
    "def read_data(filename):\n",
    "    df = pd.read_parquet(filename)\n",
    "\n",
    "    df['duration'] = df.tpep_dropoff_datetime - df.tpep_pickup_datetime\n",
    "    df.duration = df.duration.dt.total_seconds() / 60\n",
    "\n",
    "    df = df[(df.duration >= 1) & (df.duration <= 60)].copy()\n",
    "\n",
    "    df[categorical] = df[categorical].astype('str')\n",
    "    \n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "3e3c42e7-4fc2-4478-aa33-3b70bc12597a",
   "metadata": {
    "id": "3e3c42e7-4fc2-4478-aa33-3b70bc12597a"
   },
   "outputs": [],
   "source": [
    "df_val = read_data('https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-02.parquet')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "c3fd052d-029c-4358-8672-81bc50561832",
   "metadata": {
    "id": "c3fd052d-029c-4358-8672-81bc50561832"
   },
   "outputs": [],
   "source": [
    "val_dicts = df_val[categorical].to_dict(orient='records')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "2ccad0a0-8e05-48e3-963b-5d91e8092867",
   "metadata": {
    "id": "2ccad0a0-8e05-48e3-963b-5d91e8092867"
   },
   "outputs": [],
   "source": [
    "X_val = dv.transform(val_dicts) \n",
    "y_val = df_val.duration.values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "4a87e14b-92f8-4fbc-8fa9-77c1afe1ca56",
   "metadata": {
    "id": "4a87e14b-92f8-4fbc-8fa9-77c1afe1ca56"
   },
   "outputs": [],
   "source": [
    "y_pred = lr.predict(X_val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "994d39c8-199d-462f-b249-b41aabc12cc1",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "994d39c8-199d-462f-b249-b41aabc12cc1",
    "outputId": "b8625583-5828-4552-901a-cd4e38f9d2d2"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val RMSE: 7.81181633377777\n"
     ]
    }
   ],
   "source": [
    "print(f'Val RMSE: {mean_squared_error(y_val, y_pred, squared=False)}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "db3806b0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
